/******************************************************************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#ifndef QWT_PLOT_INTERVAL_CURVE_H
#define QWT_PLOT_INTERVAL_CURVE_H

#include "qwt_global.h"
#include "qwt_plot_seriesitem.h"

class QwtIntervalSymbol;
template<typename T>
class QwtSeriesData;

/*!
   \brief QwtPlotIntervalCurve represents a series of samples, where each value
         is associated with an interval ( \f$[y1,y2] = f(x)\f$ ).

   The representation depends on the style() and an optional symbol()
   that is displayed for each interval. QwtPlotIntervalCurve might be used
   to display error bars or the area between 2 curves.
 */
class QWT_EXPORT QwtPlotIntervalCurve : public QwtPlotSeriesItem,
                                        public QwtSeriesStore<QwtIntervalSample>
{
public:
  /*!
      \brief Curve styles.
      The default setting is QwtPlotIntervalCurve::Tube.

      \sa setStyle(), style()
   */
  enum CurveStyle
  {
    /*!
       Don't draw a curve. Note: This doesn't affect the symbols.
     */
    NoCurve,

    /*!
       Build 2 curves from the upper and lower limits of the intervals
       and draw them with the pen(). The area between the curves is
       filled with the brush().
     */
    Tube,

    /*!
       Styles >= QwtPlotIntervalCurve::UserCurve are reserved for derived
       classes that overload drawSeries() with
       additional application specific curve types.
     */
    UserCurve = 100
  };

  /*!
      Attributes to modify the drawing algorithm.
      \sa setPaintAttribute(), testPaintAttribute()
   */
  enum PaintAttribute
  {
    /*!
       Clip polygons before painting them. In situations, where points
       are far outside the visible area (f.e when zooming deep) this
       might be a substantial improvement for the painting performance.
     */
    ClipPolygons = 0x01,

    //! Check if a symbol is on the plot canvas before painting it.
    ClipSymbol = 0x02
  };

  Q_DECLARE_FLAGS(PaintAttributes, PaintAttribute)

  explicit QwtPlotIntervalCurve(const QString &title = QString());
  explicit QwtPlotIntervalCurve(const QwtText &title);

  virtual ~QwtPlotIntervalCurve();

  virtual int rtti() const QWT_OVERRIDE;

  void setPaintAttribute(PaintAttribute, bool on = true);
  bool testPaintAttribute(PaintAttribute) const;

  void setSamples(const QVector<QwtIntervalSample> &);
  void setSamples(QwtSeriesData<QwtIntervalSample> *);

  void setPen(const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine);

  void setPen(const QPen &);
  const QPen &pen() const;

  void setBrush(const QBrush &);
  const QBrush &brush() const;

  void setStyle(CurveStyle style);
  CurveStyle style() const;

  void setSymbol(const QwtIntervalSymbol *);
  const QwtIntervalSymbol *symbol() const;

  virtual void drawSeries(QPainter *, const QwtScaleMap &xMap,
                          const QwtScaleMap &yMap, const QRectF &canvasRect,
                          int from, int to) const QWT_OVERRIDE;

  virtual QRectF boundingRect() const QWT_OVERRIDE;

  virtual QwtGraphic legendIcon(int index, const QSizeF &) const QWT_OVERRIDE;

protected:
  void init();

  virtual void drawTube(QPainter *, const QwtScaleMap &xMap,
                        const QwtScaleMap &yMap, const QRectF &canvasRect,
                        int from, int to) const;

  virtual void drawSymbols(QPainter *, const QwtIntervalSymbol &,
                           const QwtScaleMap &xMap, const QwtScaleMap &yMap,
                           const QRectF &canvasRect, int from, int to) const;

private:
  class PrivateData;
  PrivateData *m_data;
};

Q_DECLARE_OPERATORS_FOR_FLAGS(QwtPlotIntervalCurve::PaintAttributes)

#endif
